package com.qf.service;

import com.qf.dao.StuDao;
import com.qf.entity.Page;
import com.qf.entity.Student;
import com.qf.util.ConnectionUtils;

import java.sql.SQLException;
import java.util.List;

/**
 * 学生service
 * description:
 * author: Ken
 * 公众号：Java架构栈
 */
public class StuService {

    private StuDao stuDao = new StuDao();

    //班级的Service
    private ClassesService clsService = new ClassesService();

    /**
     * 查询学生列表
     * @return
     */
    public List<Student> queryStus(){
        List<Student> stus = null;
        try {
            stus = stuDao.queryAll();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return stus;
    }

    /**
     * 分页查询的业务方法
     * @param page - 传入的page中 只有 当前页 以及 每页显示多少条
     * @return page对象 - 当前页 以及 每页显示多少条 还有 总条数 总页码 当前页的列表数据
     */
    public Page queryStusPage(Page page){
        //查询所有学生的数量
        int stuSum = stuDao.queryAllStusSum();

        //放入page对象中
        page.setPageSum(stuSum);

        //计算当前的总页码 <- 总条数 每页多少条
        int pageCount = page.getPageSum() % page.getPageSize() == 0 ?
                page.getPageSum() / page.getPageSize() : page.getPageSum() / page.getPageSize() + 1;
        page.setPageCount(pageCount);

        //调用dao层查询当前页的列表数据
        List<Student> stus = stuDao.queryStusPage(page);
        page.setDatas(stus);
        return page;
    }

    /**
     * ThreadLocal
     *
     * 添加学生 - 业务 - 事务
     * @return
     */
    public int insertStus(Student student) {
        //-----开启事务 - 判断当前是否存在事务，如果存在事务，则直接用当前的事务，如果不出来事务就会开启一个事务
        try {
            ConnectionUtils.begin();

            //调用dao层 添加学生信息
            int result = stuDao.insert(student);
            if (result > 0) {
                //调用班级的Service，修改班级人数
                clsService.updateClsCount(student.getCid(), 1, 0);
            }

            System.out.println("后续还有N多的业务代码要执行");

            //-----提交事务
            ConnectionUtils.commit();
        } catch (Exception e) {
            //-----回滚事务
            ConnectionUtils.rollback();
        }

        return 1;
    }
}
